# -*- coding: utf-8 -*-
"""
@Time    : 2024/7/13 13:59 
@Author  : ZhangShenao 
@File    : thread_safity.py 
@Desc    : 线程安全

即使有GIL机制,我也编程时也不应该依赖GIL机制来保证线程安全
因为Thread还有check_interval这样的抢占机制
因此,在设计并发操作时,一定要主动处理线程安全问题,如使用lock等工具

GIL的设计,主要是为了方便CPython解释器层面的编写者,而不是Python应用层面的程序员

"""
import threading
from threading import Thread

n = 0

# 创建线程锁
lock = threading.Lock()


def incr():
    """累加操作"""

    global n

    # 加线程锁,保证线程安全
    with lock:
        for i in range(1000):
            n += 1


def accumulate():
    """多线程实现累加操作"""

    # 开启多个线程,并发执行累加操作
    threads = []
    for i in range(100):
        t = Thread(target=incr)
        threads.append(t)

    for t in threads:
        t.start()

    for t in threads:
        t.join()


if __name__ == '__main__':
    accumulate()

    print(f'n = {n}')
